package com.css.common.core.config;

import lombok.NonNull;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

/**
 *
 * @project qyd-znsb
 * @package com.css.znsb.framework.common.ctx
 * @file SpringCtxHolder.java 创建时间:2024/4/9 21:37
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2024 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 风险分析池
 * @author 商健
 * @reviewer 审核人
 * @version 1.0.0
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 *
 */
@Component
@Lazy(false) // 强制立即加载
public class SpringContextHolder implements ApplicationContextAware {
    private static volatile ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(@NonNull ApplicationContext applicationContext) {
        // 添加空检查
        if (SpringContextHolder.applicationContext == null) {
            synchronized (SpringContextHolder.class) {
                if (SpringContextHolder.applicationContext == null) {
                    SpringContextHolder.applicationContext = applicationContext;
                }
            }
        }
    }

    // 获取上下文时添加空检查
    public static ApplicationContext getApplicationContext() {
        checkContext();
        return applicationContext;
    }

    private static void checkContext() {
        if (applicationContext == null) {
            throw new IllegalStateException("Spring上下文未初始化，请检查：\n"
                    + "1. 确保类被Spring管理\n"
                    + "2. 检查@ComponentScan配置\n"
                    + "3. 避免在静态代码块中过早调用");
        }
    }

}
